﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using XRM.Security.WebUI.Consts;
using XRM.Security.WebUI.Models.Common;

namespace XRM.Security.WebUI.Models.Report
{
    public class CreateReportModel : IValidatableObject
    {
        public ReportTypes ReportType { get; set; }
        public int? Value { get; set; }
        public DateTime? StartPeriod { get; set; }
        public DateTime? EndPeriod { get; set; }
        
        public List<ItemCheckBoxModel> CheckBoxItems { get; set; }
        public List<SelectListItem> SelectListItems { get; set; }

        public IEnumerable<int> GetSelectedCheckBoxValues()
        {
            return CheckBoxItems == null ? new List<int>() : CheckBoxItems.Where( s => s.IsChecked ).Select( s => Int32.Parse(s.Code) );
        }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            switch (ReportType)
            {
                case ReportTypes.UserReport:
                    if (CheckBoxItems.All( s => s.IsChecked == false))
                        yield return new ValidationResult("Выберите статус пользователя");
                    break;
                case ReportTypes.DepartmentByScsiReport:
                    if (CheckBoxItems.All( s => s.IsChecked == false))
                        yield return new ValidationResult("Выберите виды СКЗИ");
                    break;
                case ReportTypes.OpenRequestReport:
                    if ( CheckBoxItems.All( s => s.IsChecked == false ) )
                        yield return new ValidationResult( "Выберите виды работ" );
                    break;
                case ReportTypes.RequestByWorkKindReport:
                    if ( CheckBoxItems.All( s => s.IsChecked == false ) )
                        yield return new ValidationResult( "Выберите виды работ" );
                    else if (StartPeriod == null && EndPeriod != null)
                        yield return new ValidationResult( "Укажите дату начала периода" );
                    break;
                case ReportTypes.ScsiReport:
                    if ( StartPeriod == null )
                        yield return new ValidationResult( "Укажите дату начала периода" );
                    else if ( EndPeriod == null )
                        yield return new ValidationResult( "Укажите дату окончания периода" );
                    break;
            }
            if (StartPeriod.HasValue && EndPeriod.HasValue && StartPeriod > EndPeriod)
                yield return new ValidationResult( "Дата начала периода не может быть позже конечной" );
        }
    }
}